package org.jsola.hr.provider;

import org.jsola.admin.dto.AsyncTaskDetailAddDTO;
import org.jsola.admin.dto.DictItemUpdateDTO;
import org.jsola.admin.dto.HeaderFieldsAddDTO;
import org.jsola.admin.entity.*;
import org.jsola.admin.query.HeaderFieldsQuery;
import org.jsola.admin.vo.*;
import org.jsola.user.core.TokenUser;

import java.util.List;
import java.util.Map;

/**
 * @author JanusMix
 */
public interface IAdminProviderService {


    /**
     * 站点开通的subjectType
     *
     * @param subjectType 业务类型
     * @param siteId      站点Id
     * @return 开通的subjectType
     */
    List<String> selectSubjectTypesBySiteAndType(String subjectType, String siteId);

    /**
     * 获取用户的所有权限
     *
     * @param subjectId   业务id
     * @param subjectType 业务类型
     * @param userId      用户id
     * @param siteId      租户id
     * @return 所有权限
     */
    AllPermissionVO getAllPermission(String userId, String subjectId, String subjectType, String siteId);

    /**
     * 获取用户的所有权限
     *
     * @param subjectId   业务id
     * @param subjectType 业务类型
     * @param userId      用户id
     * @param siteId      租户id
     * @return 所有权限
     */
    AllPermissionVO getAllPermission2(String userId, String subjectId, String subjectType, String siteId);

    /**
     * 获取菜单列表
     *
     * @param subjectTypeList 对象类型list
     * @return list
     */
    List<MenuVO> getMenuList(List<String> subjectTypeList);

    /**
     * 获取公司有权限的地区列表
     *
     * @param companyId 公司id
     * @param tokenUser 当前用户
     * @return 公司有权限的地区列表
     */
    List<AreaListVO> listAreaByCompany(String companyId, TokenUser tokenUser);

    /**
     * 根据入职城市id获取城市名称,全部取出来,例:山东/青岛/市北
     *
     * @param areaId 地区id
     * @return 城市名称, 全部取出来, 例:山东/青岛/市北
     */
    String getAreaNameById(String areaId);

    /**
     * 根据租户id查找
     *
     * @param siteId    租户id
     * @param tokenUser 登录用户
     * @return 租户详情信息
     */
    SiteVO selectSiteById(String siteId, TokenUser tokenUser);

    /**
     * 根据租户二级域名查找租户配置
     *
     * @param secDomain 二级域名
     * @return 租户详情信息
     */
    SiteVO selectSiteBySecDomain(String secDomain);


    /**
     * 根据站点ID集合查询站点列表
     *
     * @param siteIdList 站点ID集合
     * @return 站点列表
     */
    List<SiteDO> selectByIds(List<String> siteIdList);

    /**
     * 根据地区名称获取地区
     *
     * @param areaList 地区列表,可不传,不传会去表中拉取
     * @param areaName 地区名称
     * @return 公司有权限的地区列表
     */
    AreaReduceVO getAreaByName(List<AreaReduceVO> areaList, String areaName);

    /**
     * 根据地区名称获取地区
     *
     * @param areaName       地区名称
     * @param parentAreaName 父级地区名称
     * @return 地区
     */
    AreaDO getAreaByName(String areaName, String parentAreaName);

    /**
     * 获取所有地区
     *
     * @return 所有地区
     */
    List<AreaReduceVO> listAllArea();

    /**
     * 获取租户映射map
     *
     * @return map
     */
    Map<String, SiteDO> selectSiteMap();

    /**
     * 修改租户Logo
     *
     * @param picUrl    logo地址
     * @param tokenUser 当前用户
     * @return 修改条数
     */
    int updateSitePic(String picUrl, TokenUser tokenUser);

    /**
     * 根据Id获取地区名
     *
     * @param areaId 地区Id
     * @return 地区名
     */
    String selectAreaById(String areaId);

    /**
     * 根据Id获取地区对象
     *
     * @param areaId 地区Id
     * @return 地区对象
     */
    AreaVO selectAreaVOById(String areaId);

    /**
     * 根据Id获取地区对象
     *
     * @param areaId 地区Id
     * @return 地区对象
     */
    AreaVO selectAreaVOById(Long areaId);

    /**
     * 查询用工单位下指定模块的自定义表头
     *
     * @param companyId  公司Id
     * @param moduleCode 模块
     * @param tokenUser  当前用户
     * @return 自定义表格列
     */
    List<HeaderFieldsDO> selectHeaderFieldsByModuleCode(String companyId, String moduleCode, TokenUser tokenUser);

    /**
     * 更具来源Id查询自定义表格列
     *
     * @param subjectType 业务类型
     * @param subjectId   业务Id
     * @param moduleCode  模块
     * @param sourceId    来源Id
     * @param tokenUser   当前用户
     * @return 自定义表格列
     */
    List<HeaderFieldsDO> selectMyselfHeaderFieldsBySourceId(String subjectType, String subjectId
            , String moduleCode, String sourceId, TokenUser tokenUser);

    /**
     * 根据字典项code和传入的关键字模糊搜索字典项下的子项
     *
     * @param value    关键字
     * @param dictCode 字典项code
     * @return 搜索结果
     */
    List<DictItemDO> selectLikeByCodeAndName(String value, String dictCode);

    /**
     * 根据字典项code和key查询value
     *
     * @param dictCode    code
     * @param dictItemKey value
     * @return 子项
     */
    DictItemDO selectByCodeAndKey(String dictCode, String dictItemKey);

    /**
     * 查询某一项字典项的所有子项
     *
     * @param dictCode code
     * @return 子项列表
     */
    List<DictItemDO> selectByDictCode(String dictCode);

    /**
     * 根据parentId查询子集
     *
     * @param dictCode code
     * @param parentId 父级Id
     * @return 子项
     */
    List<DictItemDO> selectDictByParentId(String dictCode, String parentId);

    /**
     * 根据权限字符串查询菜单
     *
     * @param permissionStringList 权限字符串
     * @return 菜单
     */
    List<MenuVO> listByPermissionStr(List<String> permissionStringList);

    /**
     * 查询所有的社保子项(这里的社保的意思是社保医保公积金的总体描述)
     *
     * @return 所有社保子项
     */
    List<DictItemDO> selectAllSocItem();

    /**
     * 批量保存
     *
     * @param insertList 保存列表
     */
    void bachSave(List<DictItemDO> insertList);

    /**
     * 根据地区id获取连接符拼接的地区名称,默认”-“拼接；示例：山东省-青岛市-市北区
     *
     * @param bankPlaceIds ”，“拼接的地区id
     * @param regex        连接符
     * @return 地区名称
     */
    String getAreaNameByIds(String bankPlaceIds, String regex);

    /**
     * 根据地区id获取连接符拼接的地区名称,默认”-“拼接；示例：山东省-青岛市-市北区
     *
     * @param bankPlaceIds ”，“拼接的地区id
     * @return 地区名称
     */
    String getAreaNameByIds(String bankPlaceIds);

    /**
     * 获取表头字段
     *
     * @param headerFieldsQuery 查询条件
     * @param tokenUser         当前用户
     * @return 地区名称
     */
    List<HeaderFieldsListVO> getHeadField(HeaderFieldsQuery headerFieldsQuery, TokenUser tokenUser);

    /**
     * 查询模块下的所有模板字段
     *
     * @param moduleCode 模块code
     * @return list
     */
    List<HeaderFieldsTemplateListVO> getAllTemplateField(String moduleCode);

    /**
     * 查询模板下的默认字段关联变量
     *
     * @param templateId 模板id
     * @return list
     */
    List<DefaultVariableDO> selectDefaultVariableByTemplateId(Long templateId);

    /**
     * 查询模板下的默认字段关联变量
     *
     * @param templateIds 模板ids
     * @return list
     */
    List<DefaultVariableDO> selectDefaultVariableByTemplateIds(List<Long> templateIds);

    /**
     * 根据id查找默认字段信息 跨站点
     *
     * @param defaultFieldIds 默认字段信息id
     * @return 默认字段信息详情信息
     */
    List<DefaultFieldDO> selectDefaultFieldByIdsNotSiteId(List<String> defaultFieldIds);

    /**
     * 根据模块code和字段名查询字段
     *
     * @param moduleCode 模块code
     * @param fieldName  字段名
     * @return 数据
     */
    List<HeaderFieldsTemplateListVO> selectHeaderByModuleAndName(String moduleCode, String fieldName);

    /**
     * 查询动态表头
     *
     * @param headerFieldsQuery 查询条件
     * @param tokenUser         当前用户
     * @return 动态表头
     */
    HeaderFieldsVO getHead(HeaderFieldsQuery headerFieldsQuery, TokenUser tokenUser);

    /**
     * 保存异步任务记录
     *
     * @param asyncTaskDO 新建参数
     * @param tokenUser   当前用户
     * @return AsyncTaskDO
     */
    AsyncTaskDO saveAsyncTask(AsyncTaskDO asyncTaskDO, TokenUser tokenUser);

    /**
     * 修改异步任务记录
     *
     * @param asyncTaskDO 修改参数
     * @param tokenUser   当前用户
     * @return AsyncTaskDO
     */
    int updateAsyncTask(AsyncTaskDO asyncTaskDO, TokenUser tokenUser);

    /**
     * 更新任务状态为失败
     *
     * @param asyncTaskId 任务id
     * @return 更新数量
     */
    int updateTaskFail(String asyncTaskId);

    /**
     * 异步任务完成度+1
     *
     * @param asyncTaskId 异步任务id
     * @return AsyncTaskDO
     */
    int finishSubTask(String asyncTaskId);

    /**
     * 保存异步任务详情
     *
     * @param asyncTaskDetailAddDTOList 异步任务详情
     * @param tokenUser                 当前用户
     * @return list
     */
    AsyncTaskDetailVO saveAsyncDetail(AsyncTaskDetailAddDTO asyncTaskDetailAddDTOList, TokenUser tokenUser);


    /**
     * 批量保存异步任务详情
     *
     * @param asyncTaskDetailAddDTOList 异步任务详情
     * @param tokenUser                 当前用户
     * @return list
     */
    List<AsyncTaskDetailVO> batchSaveAsyncDetail(List<AsyncTaskDetailAddDTO> asyncTaskDetailAddDTOList,
                                                 TokenUser tokenUser);

    /**
     * 查询用工单位下指定模块当前登录人的自定义表头
     *
     * @param companyId  业务Id
     * @param moduleCode 模块
     * @param tokenUser  当前用户
     * @return 表头
     */
    List<HeaderFieldsDO> selectByModuleCodeAndUser(String companyId, String moduleCode, TokenUser tokenUser);

    /**
     * 根据 moduleCode 和 fieldGroup 查询默认表头
     *
     * @param moduleCode 模块code
     * @param fieldGroup 分组名称
     * @return 表头
     */
    List<HeaderFieldsTemplateDO> selectByCodeAndGroup(String moduleCode, String fieldGroup);

    /**
     * 批量保存自定义表头
     *
     * @param addList   添加列表
     * @param tokenUser 当前用户
     */
    void bachSaveHeaderFields(List<HeaderFieldsAddDTO> addList, TokenUser tokenUser);

    /**
     * 删除用工单位下指定模块的当前登录人的自定义表头
     *
     * @param companyId  公司Id
     * @param moduleCode 模块
     * @param tokenUser  当前用户
     */
    void deleteByModuleCodeAndUser(String companyId, String moduleCode, TokenUser tokenUser);

    /**
     * 更新dict
     *
     * @param dictItemUpdateDTO 更新参数
     * @param tokenUser         当前用户
     */
    void updateDictItem(DictItemUpdateDTO dictItemUpdateDTO, TokenUser tokenUser);

    /**
     * 删除dict
     *
     * @param tokenUser  当前用户
     * @param dictItemId 主键Id
     * @return 删除条数
     */
    int deleteDictItemByIds(TokenUser tokenUser, String dictItemId);

    /**
     * 查询数据字典项
     *
     * @param keyWord   关键字
     * @param dictCode  字典code
     * @param tokenUser 当前用户
     * @return 数据字典项
     */
    List<DictItemDO> selectAllDictItem(String keyWord, String dictCode, TokenUser tokenUser);
}
